CC=gcc
#"Position Independent Code"。这个选项在编译阶段生效，用于生成可以在内存中的任意位置执行的代码，通常用于创建共享库，虽然没有 -fPIC 不会完全阻止生成动态库，但为了安全和兼容性，建议始终使用该选项。
# -rdynamic 在链接阶段生效, 编译器会将所有符号（包括那些未被直接使用的符号）导出到动态链接器。这意味着，在生成的可执行文件中，这些符号可以在运行时被访问。
# 注意，-rdynamic 选项实际上不会对生成动态库造成影响
# -Isrc 似乎不会递归包含 src 的子目录
#------------------------------------
# CFLAGS=-g -Wall -Wextra -Isrc -DNDEBUG -fPIC -rdynamic $(OPTFLAGS)
# libdl 是程序调用动态链接器以访问动态库的方法
# LIBS=-ldl $(OPTLIBS)
.PHONY: clean tests install

SOURCES=$(wildcard src/*.c src/**/*.c)
OBJECTS=$(patsubst %.c,%.o,$(SOURCES)) #就地编译成 obj

TARGET=build/libmylib.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))

TEST_SRCS = $(wildcard tests/*_tests.c)
TESTS = $(patsubst %.c,%,$(TEST_SRCS))

all: $(TARGET) $(TESTS) tests

tests: $(TESTS)
	#sh ./tests/runtests.sh
	python3 ./tests/runtests.py ./tests

$(TESTS): $(TEST_SRCS) $(TARGET)# $(SO_TARGET)
$(TESTS): %: %.c
	$(CC) -g -Wall -Wextra -Isrc -fPIC $< -o $@ -Lbuild -lmylib

$(SO_TARGET): $(OBJECTS)
	$(CC) -shared -o $@ $(OBJECTS) -rdynamic -ldl

$(TARGET): $(OBJECTS)
	@mkdir -p build
	@mkdir -p bin
	ar rcsv $@ $(OBJECTS)
	ranlib $@
#其实 ar s 已经生成索引了，ranlib 主要是为了兼容性啥的

$(OBJECTS): $(SOURCES)
$(OBJECTS): %.o: %.c
	$(CC) -g -Wall -Wextra -Isrc -DNDEBUG -fPIC -c $< -o $@

PREFIX=/usr/local
install: all
	install -d $(DESTDIR)/$(PREFIX)/lib/
	install $(TARGET) $(DESTDIR)/$(PREFIX)/lib/

clean:
	rm -rf build $(OBJECTS) $(TESTS)
